//
//  Stack.swift
//  Swift刷算法
//
//  Created by 卢悦明 on 2020/12/28.
//

import Foundation
/// 栈 （Java的stack是用动态数组实现的）
class Stack<E: Equatable> {
    
    var elements: [E] = [E]()
    
    private init(elements: [E]) {
        self.elements.append(contentsOf: elements)
    }
    init() {
        
    }
    
    /// 入栈
    func push(_ element: E) {
        elements.append(element)
    }
    
    /// 出栈
    @discardableResult func pop() -> E? {
        return elements.popLast()
    }
    
    /// 顶部元素
    @discardableResult  func top() -> E? {
        return elements.last
    }
    
    /// 大小
    func size() -> Int {
        elements.count
    }
    
    /// 清空
    func clear() {
        elements.removeAll()
    }
    
    /// 是否为空
    func isEmpty() -> Bool {
        elements.count == 0
    }
}

extension Stack {
    
    /// 构造方法
    static func creatStack(array: [E]) -> Stack {
        Stack(elements: array)
    }
    
    /// 打印栈中的内容<从栈顶到尾部>
    func printStack() {
        let elements = self.elements
        print("栈结构")
        for elem in elements.reversed() {
            print("| \(elem) |")
        }
        print("|___|")
        
    }
    
}
